



<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  
  <title>Not using named tuples when returning more than one value from a function &mdash; Python Anti-Patterns  documentation</title>
  

  
  

  

  
  
    

  

  
  
    <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
  

  
    <link rel="stylesheet" href="../_static/css/ribbon.css" type="text/css" />
  
    <link rel="stylesheet" href="../_static/css/font-awesome-4.1.0/css/font-awesome.min.css" type="text/css" />
  
    <link rel="stylesheet" href="../_static/css/menu.css" type="text/css" />
  
        <link rel="index" title="Index"
              href="../genindex.html"/>
        <link rel="search" title="Search" href="../search.html"/>
    <link rel="top" title="Python Anti-Patterns  documentation" href="../index.html"/>
        <link rel="up" title="Readability" href="index.html"/>
        <link rel="next" title="Not using unpacking for updating multiple values at once" href="not_using_unpacking_for_updating_multiple_values_at_once.html"/>
        <link rel="prev" title="Not using items() to iterate over a dictionary" href="not_using_items_to_iterate_over_a_dictionary.html"/> 

</head>

<body class="wy-body-for-nav" role="document">

  <div class="wy-grid-for-nav">

    
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-nav-search">
        <a href="../index.html"> Python Anti-Patterns</a>
        <div role="search">
  <form id ="rtd-search-form" class="wy-form" action="../search.html" method="get">
    <input type="text" name="q" placeholder="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>
      </div>


      <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
        
        
            <ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../correctness/index.html"><i class="fa fa-check"></i> Correctness</a></li>
<li class="toctree-l1"><a class="reference internal" href="../maintainability/index.html"><i class="fa fa-puzzle-piece"></i> Maintainability</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="index.html"><i class="fa fa-eye"></i> Readability</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="asking_for_permission_instead_of_forgiveness_when_working_with_files.html">Asking for permission instead of forgiveness</a></li>
<li class="toctree-l2"><a class="reference internal" href="comparison_to_none.html">Comparing things to <cite>None</cite> the wrong way</a></li>
<li class="toctree-l2"><a class="reference internal" href="comparison_to_true.html">Comparing things to <cite>True</cite> the wrong way</a></li>
<li class="toctree-l2"><a class="reference internal" href="do_not_compare_types_use_isinstance.html">Using <cite>type()</cite> to compare types</a></li>
<li class="toctree-l2"><a class="reference internal" href="not_using_a_dict_comprehension.html">Not using dict comprehensions</a></li>
<li class="toctree-l2"><a class="reference internal" href="not_using_dict_keys_when_formatting_strings.html">Not using dict keys when formatting strings</a></li>
<li class="toctree-l2"><a class="reference internal" href="not_using_items_to_iterate_over_a_dictionary.html">Not using <code class="docutils literal notranslate"><span class="pre">items()</span></code> to iterate over a dictionary</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">Not using named tuples when returning more than one value from a function</a></li>
<li class="toctree-l2"><a class="reference internal" href="not_using_unpacking_for_updating_multiple_values_at_once.html">Not using unpacking for updating multiple values at once</a></li>
<li class="toctree-l2"><a class="reference internal" href="not_using_zip_to_iterate_over_a_pair_of_lists.html">Not using <code class="docutils literal notranslate"><span class="pre">zip()</span></code> to iterate over a pair of lists</a></li>
<li class="toctree-l2"><a class="reference internal" href="putting_type_information_in_a_variable_name.html">Putting type information in a variable name</a></li>
<li class="toctree-l2"><a class="reference internal" href="test_for_object_identity_should_be_is_not.html">Test for object identity should be <code class="docutils literal notranslate"><span class="pre">is</span></code></a></li>
<li class="toctree-l2"><a class="reference internal" href="using_an_unpythonic_loop.html">Using an unpythonic loop</a></li>
<li class="toctree-l2"><a class="reference internal" href="using_map_or_filter_where_list_comprehension_is_possible.html">Using <code class="docutils literal notranslate"><span class="pre">map()</span></code> or <code class="docutils literal notranslate"><span class="pre">filter()</span></code> where list comprehension is possible</a></li>
<li class="toctree-l2"><a class="reference internal" href="using_camelcase_in_function_names.html">Using <cite>CamelCase</cite> in function names</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../security/index.html"><i class="fa fa-lock"></i> Security</a></li>
<li class="toctree-l1"><a class="reference internal" href="../performance/index.html"><i class="fa fa-dashboard"></i> Performance</a></li>
<li class="toctree-l1"><a class="reference internal" href="../django/index.html"><i class="fa fa-book"></i> Django</a></li>
</ul>

        
      </div>
      &nbsp;

    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">

      
      <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
        <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
        <a href="../index.html">Python Anti-Patterns</a>
      </nav>


      
      <div class="wy-nav-content" id="signup-box" >
        <div class="rst-content">
          <div class="navigation" role="navigation" aria-label="breadcrumbs navigation">
  <ul class="wy-breadcrumbs">
    <li><a href="../index.html">Documentation</a> &raquo;</li>
      
          <li><a href="index.html"><i class="fa fa-eye"></i> Readability</a> &raquo;</li>
      
    <li>Not using named tuples when returning more than one value from a function</li>
      <li class="wy-breadcrumbs-aside">
        
          <a href="../_sources/readability/not_using_named_tuples_when_returning_more_than_one_value.rst.txt" rel="nofollow"> View page source</a>
        
      </li>
  </ul>
  <hr/>
</div>

          <div role="main">
            
  <div class="section" id="not-using-named-tuples-when-returning-more-than-one-value-from-a-function">
<h1>Not using named tuples when returning more than one value from a function<a class="headerlink" href="#not-using-named-tuples-when-returning-more-than-one-value-from-a-function" title="Permalink to this headline">¶</a></h1>
<p>Named tuples can be used anywhere where normal tuples are acceptable, but their values can be accessed through their names in addition to their indexes. This makes the code more verbose and readable.</p>
<div class="section" id="anti-pattern">
<h2>Anti-pattern<a class="headerlink" href="#anti-pattern" title="Permalink to this headline">¶</a></h2>
<p>The code below returns a first name, middle name, and last name using a normal, unnamed tuple. After calling the tuple, each value can only be returned via an index. This code is difficult to use: the caller of the function has to know that the first element is the first name, the second is the middle name, and the third is the last name.</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">get_name</span><span class="p">():</span>
    <span class="k">return</span> <span class="s2">&quot;Richard&quot;</span><span class="p">,</span> <span class="s2">&quot;Xavier&quot;</span><span class="p">,</span> <span class="s2">&quot;Jones&quot;</span>

<span class="n">name</span> <span class="o">=</span> <span class="n">get_name</span><span class="p">()</span>

<span class="c1"># no idea what these indexes map to!</span>
<span class="nb">print</span><span class="p">(</span><span class="n">name</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">name</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">name</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
</pre></div>
</div>
</div>
<div class="section" id="best-practice">
<h2>Best practice<a class="headerlink" href="#best-practice" title="Permalink to this headline">¶</a></h2>
<div class="section" id="use-named-tuples-to-return-multiple-values">
<h3>Use named tuples to return multiple values<a class="headerlink" href="#use-named-tuples-to-return-multiple-values" title="Permalink to this headline">¶</a></h3>
<p>The modified code below uses named tuples to return multiple values. This code is easier to use and easier to read, as now the caller can access each piece of data via a straightforward name (like <code class="docutils literal notranslate"><span class="pre">name.first</span></code>).</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">namedtuple</span>

<span class="k">def</span> <span class="nf">get_name</span><span class="p">():</span>
    <span class="n">name</span> <span class="o">=</span> <span class="n">namedtuple</span><span class="p">(</span><span class="s2">&quot;name&quot;</span><span class="p">,</span> <span class="p">[</span><span class="s2">&quot;first&quot;</span><span class="p">,</span> <span class="s2">&quot;middle&quot;</span><span class="p">,</span> <span class="s2">&quot;last&quot;</span><span class="p">])</span>
    <span class="k">return</span> <span class="n">name</span><span class="p">(</span><span class="s2">&quot;Richard&quot;</span><span class="p">,</span> <span class="s2">&quot;Xavier&quot;</span><span class="p">,</span> <span class="s2">&quot;Jones&quot;</span><span class="p">)</span>

<span class="n">name</span> <span class="o">=</span> <span class="n">get_name</span><span class="p">()</span>

<span class="c1"># much easier to read</span>
<span class="nb">print</span><span class="p">(</span><span class="n">name</span><span class="o">.</span><span class="n">first</span><span class="p">,</span> <span class="n">name</span><span class="o">.</span><span class="n">middle</span><span class="p">,</span> <span class="n">name</span><span class="o">.</span><span class="n">last</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="references">
<h2>References<a class="headerlink" href="#references" title="Permalink to this headline">¶</a></h2>
<ul class="simple">
<li><p><a class="reference external" href="https://docs.python.org/2/library/collections.html#namedtuple-factory-function-for-tuples-with-named-fields">Python Standard Libary - collections.namedtuple</a></p></li>
</ul>
</div>
</div>


          </div>
          <footer>
  
    <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
      
        <a href="not_using_unpacking_for_updating_multiple_values_at_once.html" class="btn btn-neutral float-right" title="Not using unpacking for updating multiple values at once"/>Next <span class="fa fa-arrow-circle-right"></span></a>
      
      
        <a href="not_using_items_to_iterate_over_a_dictionary.html" class="btn btn-neutral" title="Not using items() to iterate over a dictionary"><span class="fa fa-arrow-circle-left"></span> Previous</a>
      
    </div>
  

  <hr/>

  <div role="contentinfo">
    <p>
    </p>
  </div>

    <!--End mc_embed_signup-->
  <a href="https://github.com/snide/sphinx_rtd_theme">Sphinx theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a> - Last updated: Sep 29, 2020 
</footer>
        </div>
      </div>

    </section>


  </div>
  


  

    <script type="text/javascript">
        var DOCUMENTATION_OPTIONS = {
            URL_ROOT:'../',
            VERSION:'',
            COLLAPSE_INDEX:false,
            FILE_SUFFIX:'.html',
            HAS_SOURCE:  true
        };
    </script>
      <script type="text/javascript" src="../_static/jquery.js"></script>
      <script type="text/javascript" src="../_static/underscore.js"></script>
      <script type="text/javascript" src="../_static/doctools.js"></script>
      <script type="text/javascript" src="../_static/language_data.js"></script>

  

  
  
    <script type="text/javascript" src="../_static/js/theme.js"></script>
  

  
  
  <script type="text/javascript">
      jQuery(function () {
          SphinxRtdTheme.StickyNav.enable();
      });
  </script>
   

  <!-- Place this tag right after the last button or just before your close body tag. -->
  <script async defer id="github-bjs" src="https://buttons.github.io/buttons.js"></script>

</body>
</html>